<?php

/**
 * LawsのModelクラスベース
 *
 * セッション情報のチェックとしてユーザ情報のチェックを行う。
 * 強制的に実行メソッド名を設定する→execute
 *
 * @author Lty-Chiba
 * @since 2010/11/17
 * @version 1.0
 */
abstract class LawsBase_Model extends Model_Core {

	/** テンプレート取得クラス格納変数 */
	protected static $tempStore;

	/** ユーザー情報のセッションキー */
	const USER_DETAIL = 'USER_DETAIL';

	/** トークンキー */
	const TOKEN = 'TOKEN';

	/**
	 * TODO Lty-Chiba
	 *
	 * コンストラクタ
	 */
	public function __construct() {
		parent::__construct();
		self::$tempStore = TemplateStore::getInstance();
//		self::sessionValid();
//		self::tokenValid();
		$this->Hoge = 'hoge';
	}

	/**
	 * TODO Lty-Chiba
	 *
	 * セッションチェック
	 */
	private function sessionValid() {
		if(self::getUser() == NULL) {
			throw new Exception('Session切れ');
		}
	}

	/**
	 * ユーザ情報の取得処理
	 *
	 * Sessionからユーザ情報を取得する。
	 * 取得できない場合はExceptionを投げる。
	 *
	 * @throws Exception
	 */
	public function getUser() {
		return Session::instance()->get(LawsBase_Model::USER_DETAIL);
	}

	/**
	 * Modelクラス実行メソッド
	 *
	 * Modelクラスの実行メソッドを強制する。
	 * (各Modelはこのメソッドに記述すること)
	 *
	 * @param PtalView_Core $template：画面テンプレート
	 */
	abstract public function execute(PHPTAL $template);

	/**
	 * トークンのチェック処理
	 *
	 * セッションとPostで送信されたトークンを比較する
	 *
	 * @return True/False
	 */
	protected function tokenValid() {
		if(Session::instance()->get(LawsBase_Model::TOKEN) != $_POST[LawsBase_Model::TOKEN]) {
			throw new Exception('不正な遷移');
		}
	}

	/**
	 * トークンの設定処理
	 *
	 * 画面とセッションにトークンを設定する
	 */
	protected function saveToken() {
		// ランダム文字列を取得
		$token = LawsStringUtil::getRandomString();

		// 画面とセッションにトークンをセット
		self::$data[LawsBase_Model::TOKEN] = $token;
		Session::instance()->set(LawsBase_Model::TOKEN, $token);
	}
}